priority -50

extends texmath

global !p

def create_table(snip):
	rows = snip.buffer[snip.line].split('x')[0]
	cols = snip.buffer[snip.line].split('x')[1]

	int_val = lambda string: int(''.join(s for s in string if s.isdigit()))

	rows = int_val(rows)
	cols = int_val(cols)

	offset = cols + 1
	old_spacing = snip.buffer[snip.line][:snip.buffer[snip.line].rfind('\t') + 1]

	snip.buffer[snip.line] = ''

	final_str = old_spacing + "\\begin{tabular}{|" + "|".join(['$' + str(i + 1) for i in range(cols)]) + "|}\n"

	for i in range(rows):
		final_str += old_spacing + '\t'
		final_str += " & ".join(['$' + str(i * cols + j + offset) for j in range(cols)])

		final_str += " \\\\\\\n"

	final_str += old_spacing + "\\end{tabular}\n$0"

	snip.expand_anon(final_str)

def add_row(snip):
	row_len = int(''.join(s for s in snip.buffer[snip.line] if s.isdigit()))
	old_spacing = snip.buffer[snip.line][:snip.buffer[snip.line].rfind('\t') + 1]

	snip.buffer[snip.line] = ''

	final_str = old_spacing
	final_str += " & ".join(['$' + str(j + 1) for j in range(row_len)])
	final_str += " \\\\\\"

	snip.expand_anon(final_str)

endglobal

snippet "\\?b(egin)?" "begin{} / end{}" br
\begin{${1:something}}
	${0:${VISUAL}}
\end{$1}
endsnippet

snippet abs "abstract environment" b
\begin{abstract}
	$0
\end{abstract}
endsnippet

snippet tab "tabular / array environment" b
\begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}}
$0${2/(?<=.)(c|l|r)|./(?1: & )/g}
\end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
endsnippet

pre_expand "create_table(snip)"
snippet "gentbl(\d+)x(\d+)" "Generate table of *width* by *height*" r
endsnippet

pre_expand "add_row(snip)"
snippet "tr(\d+)" "Add table row of dimension ..." r
endsnippet

snippet table "Table environment" b
\begin{table}[${1:htpb}]
	\centering
	\caption{${2:caption}}
	\label{tab:${3:label}}
	\begin{${4:t}${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${5:c}}
	$0${5/(?<=.)(c|l|r)|./(?1: & )/g}
	\end{$4${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
\end{table}
endsnippet

snippet fig "Figure environment" b
\begin{figure}[${2:htpb}]
	\centering
	\includegraphics[width=${3:0.8}\linewidth]{${4:name.ext}}
	\caption{${4/(\w+)\.\w+/\u$1/}$0}%
	\label{fig:${4/(\w+)\.\w+/$1/}}
\end{figure}
endsnippet

snippet enum "Enumerate" b
\begin{enumerate}
	\item $0
\end{enumerate}
endsnippet

snippet item "Itemize" b
\begin{itemize}
	\item $0
\end{itemize}
endsnippet

snippet desc "Description" b
\begin{description}
	\item[$1] $0
\end{description}
endsnippet

snippet it "Individual item" b
\item $0
endsnippet

snippet part "Part" b
\part{${1:part name}}%
\label{prt:${2:${1/(\w+)|\W+/(?1:\L$0\E:_)/ga}}}

$0
endsnippet

snippet cha "Chapter" b
\chapter{${1:chapter name}}%
\label{cha:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

$0
endsnippet

snippet sec "Section"
\section{${1:${VISUAL:section name}}}%
\label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

$0
endsnippet

snippet sec* "Section"
\section*{${1:${VISUAL:section name}}}%
\label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

${0}
endsnippet


snippet sub "Subsection"
\subsection{${1:${VISUAL:subsection name}}}%
\label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

$0
endsnippet

snippet sub* "Subsection"
\subsection*{${1:${VISUAL:subsection name}}}%
\label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

${0}
endsnippet

snippet ssub "Subsubsection"
\subsubsection{${1:${VISUAL:subsubsection name}}}%
\label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

$0
endsnippet

snippet ssub* "Subsubsection"
\subsubsection*{${1:${VISUAL:subsubsection name}}}%
\label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

${0}
endsnippet

snippet par "Paragraph"
\paragraph{${1:${VISUAL:paragraph name}}}%
\label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

$0
endsnippet

snippet subp "Subparagraph"
\subparagraph{${1:${VISUAL:subparagraph name}}}%
\label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}

$0
endsnippet

snippet ac "Acroynm normal" b
\ac{${1:acronym}}
$0
endsnippet

snippet acl "Acroynm expanded" b
\acl{${1:acronym}}
$0
endsnippet

snippet ni "Non-indented paragraph" b
\noindent
$0
endsnippet

snippet pac "Package" b
\usepackage`!p snip.rv='[' if t[1] else ""`${1:options}`!p snip.rv = ']' if t[1] else ""`{${2:package}}$0
endsnippet

snippet lp "Long parenthesis"
\left(${1:${VISUAL:contents}}\right)$0
endsnippet

snippet "mint(ed)?( (\S+))?" "Minted code typeset" br
\begin{listing}
\begin{minted}[linenos,numbersep=5pt,frame=lines,framesep=2mm]{${1:`!p
snip.rv = match.group(3) if match.group(2) is not None else "language"`}}
${2:${VISUAL:code}}
\end{minted}
\caption{${3:caption name}}
\label{lst:${4:${3/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
\end{listing}

$0
endsnippet

snippet gln "New glossary item" b
\newglossaryentry{${1:identifier}}
{
  name={${2:name}},
  first={${3:first occurrence}},
  sort={${4:sort value}},
  description={${0:description}},
}
endsnippet
snippet glnl "New long glossary item" b
\longnewglossaryentry{${1:identifier}}
{
  name={${2:name}},
  first={${3:first occurrence}},
  sort={${4:sort value}},
}
{
  ${0:description}
}
endsnippet

# Bold text
snippet bf "Bold"
\textbf{$1} $0
endsnippet

# Italic text
snippet ita "Italics"
\textit{$1} $0
endsnippet

# Underlined text
snippet und "Underline"
\underline{$1} $0
endsnippet

# vim:ft=snippets:
